/*
 * ComponenteDistribuidorGeneradorClaseCompleja.java
 *
 * Copyright 2011 Universidad Francisco de Paula Santander (UFPS).
 * Todos los Derechos Reservados.
 * Creado el 2/03/2011, 05:33:18 PM
 */

package com.ufps.cuatro.modelo.representacion.componente;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

import com.ufps.cuatro.controlador.render.UtilRender;
import com.ufps.cuatro.modelo.analizador.ObjetoReflexion;
import com.ufps.cuatro.modelo.biblioteca.TipoBiblioteca;
import com.ufps.cuatro.modelo.representacion.PlantillaCombo;
import com.ufps.cuatro.modelo.representacion.PlantillaComponente;
import com.ufps.cuatro.modelo.representacion.UtilRepresentacion;
import com.ufps.cuatro.util.Utileria;
import com.ufps.cuatro.util.base.ComponenteBaseStandar;
import com.ufps.cuatro.util.generadores.codeobject.CodeContextLine;
import com.ufps.cuatro.util.generadores.codeobject.EnumTypeCodeSyntax;

/**
 * <i><b>ComponenteDistribuidorGeneradorClaseCompleja:</b></i><p>Esta Clase es utilizada para representar
 * propiedades de una clase del Modelo analizado.</p>
 * 
 * @author Carlos A. Torres C. - Dolly E. Guerrero. <https://code.google.com/p/tesis4dor/>
 * @version 1.0 2/03/2011
 * @see ComponenteDistribuidorGeneradorClase 
 */
public class ComponenteDistribuidorGeneradorClaseCompleja extends ComponenteDistribuidorGeneradorClase{
    private static final long serialVersionUID = -7376631559010990573L;
    
    private int idClaseComponenteGeneradorClaseCompleja;
    /**
     * Serie Númerica para la generación de id de Objetos.
     */
    public static int serialIdComponenteGeneradorClaseCompleja;       
    /**
     * Contiene la Colección de <code>Componente</code>s que representan las
     * Propiedades de la Clase.
     */
    protected ArrayList<Componente> objComponentes;  
    /**
     * Lista de Espera de Componentes para completar la creación del Objeto Actual.
     */
    protected ArrayList<ObjetoReflexion> objListaEsperaClassPath;    

    /** 
     * Constructor por Defecto.      
     * @param objComponenteBase  Componente Base para la Representación.    
     * @param strClassPathTipoDato Definición del Tipo de Dato que representa la clase.
     * @param heredado Indica si el Objeto es heredado.
     * @param previsualizar  Inidica si el Objeto soporta visualizaciones.
     */
    public ComponenteDistribuidorGeneradorClaseCompleja(ComponenteBaseStandar objComponenteBase, String strClassPathTipoDato, boolean heredado, boolean previsualizar) {
        super(objComponenteBase, strClassPathTipoDato, true, true);  
        this.heredado = heredado;
        this.previsualizar = previsualizar;
        this.dni = Utileria.leerRecursoTexto("Utileria.dni.componente.distribuidor.generador.clase.compleja");  
        this.objComponentes = new ArrayList<Componente>();
        if(!heredado){
            this.idClaseComponenteGeneradorClaseCompleja = (!previsualizar) ?
                    ComponenteDistribuidorGeneradorClaseCompleja.serialIdComponenteGeneradorClaseCompleja++ :
                    ComponenteDistribuidorGeneradorClaseCompleja.serialIdComponenteGeneradorClaseCompleja;
        }
        Class<?> objClass;
        try {
            objClass = Class.forName(strClassPathTipoDato);
            this.strSimpleClassPathTipoDato = objClass.getSimpleName();
        } catch (ClassNotFoundException ex) {
            //Logger.getLogger(ComponenteDistribuidorGeneradorClaseCompleja.class.getName()).log(Level.SEVERE, null, ex);
            if(strClassPathTipoDato.length() >= 2){
                int i = strClassPathTipoDato.lastIndexOf(".");
                this.strSimpleClassPathTipoDato = 
                        String.valueOf(Character.toUpperCase(strClassPathTipoDato.charAt(i + 1))) + 
                        strClassPathTipoDato.substring(i + 2);        
            }
        }
        objListaEsperaClassPath = new ArrayList<ObjetoReflexion>();
    }
    
    /**
     * Devuelve el id de creación del Componente. No se debe confundir con el #getId()
     * @return id de creación del Componente.
     */
    public int getIdClaseComponenteGeneradorClaseCompleja() {
       try{
        return idClaseComponenteGeneradorClaseCompleja;
        }catch(java.lang.NullPointerException ex){}
       return 0;
    }

    public void crearDistribuicionGrupalInicial(PlantillaCombo objPlantillaCombo, ArrayList<PlantillaComponente> objTempPlantillasComponentes){                
       try{
            ArrayList<Componente> objComponentesIncluidos = new ArrayList<Componente>();
            //Ubicar cada Plantilla con el Componente Asigando y Actualizar
            //Esta busqueda se hace por medio del id
            for(PlantillaComponente objTempPlantillaComponente : objTempPlantillasComponentes){            
                Componente objComponente = this.objComponentes.get(objTempPlantillaComponente.getId());
                objComponente.agregarDistribucionIndividual(objPlantillaCombo, objTempPlantillaComponente);
                objComponentesIncluidos.add(objComponente);            
            }
            Distribuidor objDistribuidor = new Distribuidor(objComponentesIncluidos, objPlantillaCombo);
            this.agregarDistribucionGrupal(objPlantillaCombo, objDistribuidor);        
        }catch(java.lang.NullPointerException ex){}
    }
         
    public ArrayList<PlantillaComponente> getDistribucionGrupalInicialHorizontal(PlantillaCombo objPlantillaCombo){
        try{
            int size = this.objComponentes.size();
            int filas = 0;
            int proxX = 0;            
            ArrayList<PlantillaComponente> objTempPlantillas = new ArrayList<PlantillaComponente>();
            for(int i = 0; i < size; i++){                
                Object obj = this.objComponentes.get(i);
                PlantillaComponente objPlantilla = new PlantillaComponente();
                if(obj instanceof Componente){
                    Componente objComponente = (Componente) obj;                    
                    objPlantilla.setX(proxX);
                    objPlantilla.setY(filas);                    
                    objPlantilla.updateGridBadConstraintsFromComponente(objComponente, objPlantillaCombo, true);
                    objPlantilla.setGenerador(false);
                    objPlantilla.setHeight(objComponente.getObjGridBagConstraints().gridheight);
                    objPlantilla.setWidth(objComponente.getObjGridBagConstraints().gridwidth);                    
                    objPlantilla.setIdComponente(objComponente.getId());
                    objPlantilla.setId(i);
                    objPlantilla.setIdPlantilla(0);
                    objPlantilla.setIncluido(true);
                    objPlantilla.setZona(0);
                    this.objComponentes.set(i, objComponente);
                }                
                proxX += objPlantilla.getObjGridBagConstraints().gridwidth;
                objTempPlantillas.add(objPlantilla);
            }            
            return objTempPlantillas;
        }catch(java.lang.Exception ex){
            Logger.getLogger(ComponenteDistribuidorGeneradorClaseCompleja.class.getName()).log(Level.SEVERE, null, ex);            
        }
        return null;
    }
    
    public ArrayList<PlantillaComponente> getDistribucionGrupalInicialVertical(PlantillaCombo objPlantillaCombo){
        try{
            int size = this.objComponentes.size();
            int columnas = 0;
            int proxX = 0;            
            ArrayList<PlantillaComponente> objTempPlantillas = new ArrayList<PlantillaComponente>();
            for(int i = 0; i < size; i++){                
                Object obj = this.objComponentes.get(i);
                PlantillaComponente objPlantilla = new PlantillaComponente();
                if(obj instanceof Componente){
                    Componente objComponente = (Componente) obj;                    
                    objPlantilla.setX(columnas);
                    objPlantilla.setY(proxX);                    
                    objPlantilla.updateGridBadConstraintsFromComponente(objComponente, objPlantillaCombo, true);
                    objPlantilla.setGenerador(false);
                    objPlantilla.setHeight(objComponente.getObjGridBagConstraints().gridheight);
                    objPlantilla.setWidth(objComponente.getObjGridBagConstraints().gridwidth);                    
                    objPlantilla.setIdComponente(objComponente.getId());
                    objPlantilla.setId(i);
                    objPlantilla.setIdPlantilla(0);
                    objPlantilla.setIncluido(true);
                    objPlantilla.setZona(0);
                    this.objComponentes.set(i, objComponente);                    
                }           
                proxX += objPlantilla.getObjGridBagConstraints().gridheight;
                objTempPlantillas.add(objPlantilla);
            }            
            return objTempPlantillas;
        }catch(java.lang.Exception ex){
            Logger.getLogger(ComponenteDistribuidorGeneradorClaseCompleja.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }
    
    public ArrayList<PlantillaComponente> getDistribucionGrupalInicialRectangular(PlantillaCombo objPlantillaCombo){
        try{
            return null;
        }catch(java.lang.Exception ex){
            Logger.getLogger(ComponenteDistribuidorGeneradorClaseCompleja.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }
    
    /**
     * Agrega una Colección al final del Contenedor Generico de Componentes.
     * @param objComponentes Colección
     */
    public void addAll(ArrayList<Componente> objComponentes){
       if(objComponentes != null){
            this.objComponentes.addAll(objComponentes);
        }
        else{
            UtilRender.printlnConsole("Objeto Componente Nulo.", UtilRender.ACTION_NORMAL, false);            
        }
    }
    
    /**
     * Agrega un Componente a la Colección.
     * @param objComponente Componente.
     */
    public void addComponente(Componente objComponente){
        this.objComponentes.add(objComponente);
    }
    
    /**
     * Actualiza el Componente en la Posición i.
     * @param i Posición del Componente.
     * @param objComponente Componente.
     */
    public void set(int i, Componente objComponente){
        this.objComponentes.set(i, objComponente);
    }
    
    /**
     * Elimina el Componente i.
     * @param i Componente.
     * @return boolean que indica el resultado del Proceso.
     */
    public boolean del(Componente i){
        return this.objComponentes.remove(i);
    }
    
    /**
     * Elimina el Componente en la Posición i.
     * @param i Posición del Componente.
     * @return Componente Eliminado.
     */
    public Componente del(int i){
        return this.objComponentes.remove(i);
    }
    
    /**
     * Devuelve la Colección Genérica de Componentes.
     * @return Colección Genérica de Componentes.
     */
    public ArrayList<Componente> getObjComponentes() {
        return objComponentes;
    }  
    
    public int sizeWidth(){        
        int size = 0;        
        for(Componente objComponente : this.objComponentes){
            size += objComponente.getObjPlantillaComponenteDistribucionIndividualSeleccionada().getObjGridBagConstraints().gridwidth;
        }
        return size;        
    }
    
    public int sizeHeight(){        
        int size = 0;
        for(Componente objComponente : this.objComponentes){
            size += objComponente.getObjPlantillaComponenteDistribucionIndividualSeleccionada().getObjGridBagConstraints().gridheight;
        }
        return size;        
    }           
    
    @Override    
    public String toString() {
       try{
            if(this.eBiblioteca == TipoBiblioteca.eSwap) {
                return this.objClassSwing.getSimpleName() + "BS" + this.dni + this.idClaseComponenteGeneradorClaseCompleja;
            }
            else if(this.eBiblioteca == TipoBiblioteca.eLocal) {
                return this.objClassSwing.getSimpleName() + "BL" + this.dni + this.idClaseComponenteGeneradorClaseCompleja;
            }
            else if(this.eBiblioteca == TipoBiblioteca.eGlobal) {
                return this.objClassSwing.getSimpleName() + "BG" + this.dni + this.idClaseComponenteGeneradorClaseCompleja;
            }
            else if(this.getObjPropiedadesDisponibles() != null){            
                //se evalua si la propiedad name ha sido inicializada
                if(!this.getObjPropiedadesDisponibles().isEmpty()){                
                    return this.getName();
                }
            }
            return this.objClassSwing.getSimpleName() + this.dni + this.idClaseComponenteGeneradorClaseCompleja;
        }catch(java.lang.NullPointerException ex){}
       return "";
    }  
    
    @Override
    public int compareTo(Object o) {
       try{
            if(o instanceof ComponenteDistribuidorGeneradorUnitario ||
                    o instanceof ComponenteDistribuidorGeneradorEnum ||
                    o instanceof ComponenteDistribuidorGeneradorVinculador ||
                    o instanceof ComponenteDistribuidorGeneradorString){
                return -1;
            }
            else if(o instanceof ComponenteDistribuidorIntegrador){
                return 1;
            }
            else{
                ComponenteDistribuidorGeneradorClaseCompleja obj = (ComponenteDistribuidorGeneradorClaseCompleja) o;
                if(this.idClaseComponenteGeneradorClaseCompleja > obj.idClaseComponenteGeneradorClaseCompleja) {
                    return 1;
                }
                else if(this.idClaseComponenteGeneradorClaseCompleja < obj.idClaseComponenteGeneradorClaseCompleja) {
                    return -1;
                }
                else {                
                    return this.objTipoDato.getStrClassPath().compareToIgnoreCase(obj.getObjTipoDato().getStrClassPath());
                }
            }
        }catch(java.lang.NullPointerException ex){}
       return 0;
    }      
    
    public boolean actualizarPlantillaComboDistribucionGrupalSeleccionada(PlantillaCombo objPlantillaComboDistribucionGrupalSeleccionada) {
        try{
            this.objPlantillaComboDistribucionIndividualSeleccionada = objPlantillaComboDistribucionGrupalSeleccionada;
            this.objPlantillaComboDistribucionGrupalSeleccionada = objPlantillaComboDistribucionGrupalSeleccionada;
            for(Componente objComponente : this.objComponentes){
                objComponente.setObjPlantillaComboDistribucionIndividualSeleccionada(objPlantillaComboDistribucionGrupalSeleccionada);
            }
            //this.getObjDistribuidorGrupalSeleccionado().actualizarPlantillaComboSeleccionada(objPlantillaComboDistribucionIndividualSeleccionada);
            return true;
        }catch(java.lang.ArrayIndexOutOfBoundsException ex){
            Logger.getLogger(ComponenteDistribuidorGeneradorClaseCompleja.class.getName()).log(Level.SEVERE, null, ex);            
        }catch(java.lang.ArrayStoreException ex){
            Logger.getLogger(ComponenteDistribuidorGeneradorClaseCompleja.class.getName()).log(Level.SEVERE, null, ex);            
        }
        return false;
    }   
        
    @Override
    public void ok() {
        if(this.previsualizar){
            this.idClaseComponenteGeneradorClaseCompleja = ComponenteDistribuidorGeneradorClaseCompleja.serialIdComponenteGeneradorClaseCompleja++;
            this.previsualizar = false;
        }
    }

    @Override
    public Componente getObjComponenteIncluido(String strName) {        
        for(Componente objComponente : this.objComponentes){
            String strPropertiesName = objComponente.getName();
            if(strName.equals(strPropertiesName)){
                return objComponente;
            }                
        }
        return null;
    }

    @Override
    public void importId(int id){
        ComponenteDistribuidorGeneradorClaseCompleja.serialIdComponenteGeneradorClaseCompleja = ++id;
        this.idClaseComponenteGeneradorClaseCompleja = ComponenteDistribuidorGeneradorClaseCompleja.serialIdComponenteGeneradorClaseCompleja++;
    }
    
    @Override
    public boolean equals(Object obj) {
        if(obj instanceof ComponenteDistribuidorGeneradorClaseCompleja){
            ComponenteDistribuidorGeneradorClaseCompleja objComponente = (ComponenteDistribuidorGeneradorClaseCompleja) obj;
            return this.toString().equals(objComponente.toString());
        }
        return super.equals(obj);
    }

    @Override
    public int hashCode() {
       try{
            int hash = 5;
            hash = 89 * hash + this.idClaseComponenteGeneradorClaseCompleja;
            return hash;
        }catch(java.lang.NullPointerException ex){}
       return 0;
    }    
    
    /**
     * Determina si existen métodos sin representar en la representación actual.
     * @return boolean que determina el resultado del proceso.
     */
    public boolean isExisteListaEspera(){
        return !this.objListaEsperaClassPath.isEmpty();
    }
    
    /**
     * Determina si existe un tipo de dato sin representar en la representación actual.
     * @param strClassPath Definición del Tipo de Dato en posible espera.
     * @return boolean que determina el resultado del proceso.
     */
    public boolean isExisteEnListaEspera(String strClassPath){
        for(ObjetoReflexion objReflexion : objListaEsperaClassPath){
            if(objReflexion.getObj() instanceof Method){
                Method objMetodo = (Method) objReflexion.getObj();
                if(UtilRepresentacion.isGetter(objMetodo)){
                    Class<?> objClass = objMetodo.getReturnType();
                    if(objClass.getCanonicalName().equals(strClassPath)){
                        return true;
                    }
                }
                else if(UtilRepresentacion.isSetter(objMetodo)){
                    Class<?> objClass = objMetodo.getParameterTypes()[0];                
                    if(objClass.getCanonicalName().equals(strClassPath)){
                        return true;
                    }                
                }
            }
        }
        return false;
    }
    
    /**
     * Agrega un Tipo de Dato a la lista de espera de la representación actual.
     * @param objReflexion Tipo de Dato en representación formal de la aplicación.
     * @return boolean que determina el resultado del proceso.
     */
    public boolean agregarEspera(ObjetoReflexion objReflexion){        
        return this.objListaEsperaClassPath.add(objReflexion);
    }
    
    /**
     * Elimina el Tipo de Dato (si existe) de la lista de espera de la representación actual.
     * @param strClassPath Definición del Tipo de Dato.
     * @return boolean que determina el resultado del proceso.
     */
    public boolean eliminarEspera(String strClassPath){
        for(ObjetoReflexion objReflexion : objListaEsperaClassPath){
            if(objReflexion.getObj() instanceof Method){
                Method objMetodo = (Method) objReflexion.getObj();
                if(UtilRepresentacion.isGetter(objMetodo)){
                    Class<?> objClass = objMetodo.getReturnType();
                    if(objClass.getCanonicalName().equals(strClassPath)){
                        return this.objListaEsperaClassPath.remove(objReflexion);
                    }
                }
                else if(UtilRepresentacion.isSetter(objMetodo)){
                    Class<?> objClass = objMetodo.getParameterTypes()[0];                
                    if(objClass.getCanonicalName().equals(strClassPath)){
                        return this.objListaEsperaClassPath.remove(objReflexion);
                    }                
                }
            }
        }
        return false;
    }
    
    /**
     * Devuelve el Tipo de Dato (si existe) de la lista de espera de la representación actual ó null.
     * @param strClassPath Definición del Tipo de Dato.
     * @return Tipo de Dato en representación formal de la aplicación´ó null si no existe.
     */
    public ObjetoReflexion devolverMetodoEnListaDeEspera(String strClassPath){
        for(ObjetoReflexion objReflexion : objListaEsperaClassPath){
            if(objReflexion.getObj() instanceof Method){
                Method objMetodo = (Method) objReflexion.getObj();
                if(UtilRepresentacion.isGetter(objMetodo)){
                    Class<?> objClass = objMetodo.getReturnType();
                    if(objClass.getCanonicalName().equals(strClassPath)){
                        return objReflexion;
                    }
                }
                else if(UtilRepresentacion.isSetter(objMetodo)){
                    Class<?> objClass = objMetodo.getParameterTypes()[0];                
                    if(objClass.getCanonicalName().equals(strClassPath)){
                        return objReflexion;
                    }                
                }
            }
        }
        return null;
    }
    
    /**
     * Devuelve una Cadena que contiene las definiciones de los Tipos de Datos
     * de la lista de espera de la representación actual.
     * @return Cadena que contiene las definiciones de los Tipos de Datos
     * de la lista de espera de la representación actual ó Cadena vacia si no existe.
     */
    public String toStringListaEspera(){
        String str = "";
        for(ObjetoReflexion objReflexion : objListaEsperaClassPath)str += objReflexion.getStrNombre() + ", ";
        return str;
    }   

    /**
     * Devuelve la Colección que representa la lista de espera de la representación actual.
     * @return Colección que representa la lista de espera de la representación actual.
     */
    public ArrayList<ObjetoReflexion> getObjListaEsperaClassPath() {
        return objListaEsperaClassPath;
    }

    /**
     * Establece la Colección que representa la lista de espera de la representación actual.
     * @param objListaEsperaClassPath Colección que representa la lista de espera de la representación actual.
     */
    public void setObjListaEsperaClassPath(ArrayList<ObjetoReflexion> objListaEsperaClassPath) {
        this.objListaEsperaClassPath = objListaEsperaClassPath;
    }

    @Override
    public ArrayList<CodeContextLine> generateSourceCodeSyntax(EnumTypeCodeSyntax eTypeCodeSyntax) {
        ArrayList<CodeContextLine> objSourceLinesCode = new ArrayList<CodeContextLine>();
        if(eTypeCodeSyntax == EnumTypeCodeSyntax.eFieldsDefinitionSimple){
            objSourceLinesCode.add(generateSourceCodeSyntaxDefinition(false));
        }
        else if(eTypeCodeSyntax == EnumTypeCodeSyntax.eFieldsDefinitionCanonical){
            objSourceLinesCode.add(generateSourceCodeSyntaxDefinition(true));
        }
        return objSourceLinesCode;
    }

    @Override
    public CodeContextLine generateSingleSourceCodeSyntax(EnumTypeCodeSyntax eTypeCodeSyntax) {
        if(eTypeCodeSyntax == EnumTypeCodeSyntax.eFieldsDefinitionSimple){
            return generateSourceCodeSyntaxDefinition(false);
        }
        else if(eTypeCodeSyntax == EnumTypeCodeSyntax.eFieldsDefinitionCanonical){
            return generateSourceCodeSyntaxDefinition(true);
        }
        return null;        
    }

    @Override
    public void generateSourceCodeSyntaxFaseFieldDefinitionInstance(ArrayList<CodeContextLine> objSourceLinesCode) {
        try{            
            for(Componente objComponenteDistribuido : getComponentesDistribuidos()){
                if(objComponenteDistribuido instanceof ComponenteDistribuidor){
                    ComponenteDistribuidor objComponenteDistribuidor = (ComponenteDistribuidor) objComponenteDistribuido;
                    objComponenteDistribuidor.generateSourceCodeSyntaxFaseFieldDefinitionInstance(objSourceLinesCode);
                }
            }
        }catch(java.lang.Exception ex){
            Logger.getLogger(ComponenteDistribuidorGeneradorClaseCompleja.class.getName()).log(Level.SEVERE, null, ex);
        }   
    }

    @Override
    public void generateSourceCodeSyntaxFaseFieldDefinitionClass(ArrayList<CodeContextLine> objSourceLinesCode) {
        try{            
            for(Componente objComponenteDistribuido : getComponentesDistribuidos()){
                if(objComponenteDistribuido instanceof ComponenteDistribuidor){
                    ComponenteDistribuidor objComponenteDistribuidor = (ComponenteDistribuidor) objComponenteDistribuido;
                    objComponenteDistribuidor.generateSourceCodeSyntaxFaseFieldDefinitionClass(objSourceLinesCode);
                }
            }
        }catch(java.lang.Exception ex){
            Logger.getLogger(ComponenteDistribuidorGeneradorClaseCompleja.class.getName()).log(Level.SEVERE, null, ex);
        }   
    }

    @Override
    public void generateSourceCodeSyntaxFaseFieldDefinitionConstant(ArrayList<CodeContextLine> objSourceLinesCode) {
        try{            
            for(Componente objComponenteDistribuido : getComponentesDistribuidos()){
                if(objComponenteDistribuido instanceof ComponenteDistribuidor){
                    ComponenteDistribuidor objComponenteDistribuidor = (ComponenteDistribuidor) objComponenteDistribuido;
                    objComponenteDistribuidor.generateSourceCodeSyntaxFaseFieldDefinitionConstant(objSourceLinesCode);
                }
            }
        }catch(java.lang.Exception ex){
            Logger.getLogger(ComponenteDistribuidorGeneradorClaseCompleja.class.getName()).log(Level.SEVERE, null, ex);
        }   
    }

    @Override
    public void generateSourceCodeSyntaxFaseFieldInitializationInstance(ArrayList<CodeContextLine> objSourceLinesCode) {
        try{            
            for(Componente objComponenteDistribuido : getComponentesDistribuidos()){
                if(objComponenteDistribuido instanceof ComponenteDistribuidor){
                    ComponenteDistribuidor objComponenteDistribuidor = (ComponenteDistribuidor) objComponenteDistribuido;
                    objComponenteDistribuidor.generateSourceCodeSyntaxFaseFieldInitializationInstance(objSourceLinesCode);
                }
            }
        }catch(java.lang.Exception ex){
            Logger.getLogger(ComponenteDistribuidorGeneradorClaseCompleja.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public void generateSourceCodeSyntaxFaseFieldInitializationClass(ArrayList<CodeContextLine> objSourceLinesCode) {
        try{            
            for(Componente objComponenteDistribuido : getComponentesDistribuidos()){
                if(objComponenteDistribuido instanceof ComponenteDistribuidor){
                    ComponenteDistribuidor objComponenteDistribuidor = (ComponenteDistribuidor) objComponenteDistribuido;
                    objComponenteDistribuidor.generateSourceCodeSyntaxFaseFieldInitializationClass(objSourceLinesCode);
                }
            }
        }catch(java.lang.Exception ex){
            Logger.getLogger(ComponenteDistribuidorGeneradorClaseCompleja.class.getName()).log(Level.SEVERE, null, ex);
        }   
    }

    @Override
    public void generateSourceCodeSyntaxFaseFieldInitializationProperties(ArrayList<CodeContextLine> objSourceLinesCode) {
        try{            
            for(Componente objComponenteDistribuido : getComponentesDistribuidos()){
                if(objComponenteDistribuido instanceof ComponenteDistribuidor){
                    ComponenteDistribuidor objComponenteDistribuidor = (ComponenteDistribuidor) objComponenteDistribuido;
                    objComponenteDistribuidor.generateSourceCodeSyntaxFaseFieldInitializationProperties(objSourceLinesCode);
                }
            }
        }catch(java.lang.Exception ex){
            Logger.getLogger(ComponenteDistribuidorGeneradorClaseCompleja.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public void generateSourceCodeSyntaxFaseFieldInitializationGridBagConstraints(ArrayList<CodeContextLine> objSourceLinesCode) {
        try{            
            for(Componente objComponenteDistribuido : getComponentesDistribuidos()){
                if(objComponenteDistribuido instanceof ComponenteDistribuidor){
                    ComponenteDistribuidor objComponenteDistribuidor = (ComponenteDistribuidor) objComponenteDistribuido;
                    objComponenteDistribuidor.generateSourceCodeSyntaxFaseFieldInitializationGridBagConstraints(objSourceLinesCode);
                }
            }
        }catch(java.lang.Exception ex){
            Logger.getLogger(ComponenteDistribuidorGeneradorClaseCompleja.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public void generateSourceCodeSyntaxFaseMethodDefinitionEvent(ArrayList<CodeContextLine> objSourceLinesCode) {
        try{            
            for(Componente objComponenteDistribuido : getComponentesDistribuidos()){
                if(objComponenteDistribuido instanceof ComponenteDistribuidor){
                    ComponenteDistribuidor objComponenteDistribuidor = (ComponenteDistribuidor) objComponenteDistribuido;
                    objComponenteDistribuidor.generateSourceCodeSyntaxFaseMethodDefinitionEvent(objSourceLinesCode);
                }
            }
        }catch(java.lang.Exception ex){
            Logger.getLogger(ComponenteDistribuidorGeneradorClaseCompleja.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public void generateSourceCodeSyntaxFaseMethodImplementEvent(ArrayList<CodeContextLine> objSourceLinesCode) {
        try{            
            for(Componente objComponenteDistribuido : getComponentesDistribuidos()){
                if(objComponenteDistribuido instanceof ComponenteDistribuidor){
                    ComponenteDistribuidor objComponenteDistribuidor = (ComponenteDistribuidor) objComponenteDistribuido;
                    objComponenteDistribuidor.generateSourceCodeSyntaxFaseMethodImplementEvent(objSourceLinesCode);
                }
            }
        }catch(java.lang.Exception ex){
            Logger.getLogger(ComponenteDistribuidorGeneradorClaseCompleja.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public void generateSourceCodeSyntaxFaseMethodImplementFunctionSet(ArrayList<CodeContextLine> objSourceLinesCode) {
        try{            
            for(Componente objComponenteDistribuido : getComponentesDistribuidos()){
                if(objComponenteDistribuido instanceof ComponenteDistribuidor){
                    ComponenteDistribuidor objComponenteDistribuidor = (ComponenteDistribuidor) objComponenteDistribuido;
                    objComponenteDistribuidor.generateSourceCodeSyntaxFaseMethodImplementFunctionSet(objSourceLinesCode);
                }
            }
        }catch(java.lang.Exception ex){
            Logger.getLogger(ComponenteDistribuidorGeneradorClaseCompleja.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public void generateSourceCodeSyntaxFaseMethodImplementFunctionGet(ArrayList<CodeContextLine> objSourceLinesCode) {
        try{            
            for(Componente objComponenteDistribuido : getComponentesDistribuidos()){
                if(objComponenteDistribuido instanceof ComponenteDistribuidor){
                    ComponenteDistribuidor objComponenteDistribuidor = (ComponenteDistribuidor) objComponenteDistribuido;
                    objComponenteDistribuidor.generateSourceCodeSyntaxFaseMethodImplementFunctionGet(objSourceLinesCode);
                }
            }
        }catch(java.lang.Exception ex){
            Logger.getLogger(ComponenteDistribuidorGeneradorClaseCompleja.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

